iT邦幫忙

2023 iThome 鐵人賽

DAY 20
2
自我挑戰組

WiFiBoy Python 玩學機介紹系列 第 20

20. 經典遊戲(五): 小蜜蜂

  • 分享至 

  • xImage
  •  

小蜜蜂遊戲簡介

根據維基百科「太空侵略者」的資料介紹,日本 TAITO 公司於 1978年發行了 「Space Invaders」的一款大型電玩遊戲,後來許多廠商跟風遊戲採用昆蟲造型,在台灣的玩家暱稱此類遊戲為「小蜜蜂」。後來1979 年,NAMCO 公司也推出了「Galaxian」遊戲,玩家使用一台戰鬥機,要摧毀侵犯地球的外星人戰鬥機。由於外星人戰機會不時往下飛,攻擊玩家,更讓此類遊戲變得更刺激,廣受當時玩家喜愛。我們現在也可以用玩學機來開發這個遊戲,是不是很厲害呢?

https://ithelp.ithome.com.tw/upload/images/20230921/20105707SuADViCzzE.png

https://ithelp.ithome.com.tw/upload/images/20230921/20105707DNBgET6Tah.png

令人驚豔的45行小蜜蜂遊戲

玩學運算科技公司提供了一套相當精簡的 Demo 程式,僅用 45行指令,就可以完成一個相當類似小蜜蜂的遊戲。精準的還原了大型電玩的玩法。未來如果學員有興趣,還能使用 VGA 擴充套件,將遊戲畫面輸出到螢幕上,甚至也能改版成多人對戰的版本。

我們先來看看程式,將程式讀進玩學機中執行吧。

https://ithelp.ithome.com.tw/upload/images/20230921/20105707r6ehBCytiO.png

# WiFiBoy OK:ESP32 Galaxian Clone Example (BlitEngine/45-Line-Example)
# 2018.09.06, ricky@wifiboy.org, WiFiBoyMini
# 2020.01.09, tklua@wifiboy.org, OK:ESP32
wb.blitpal()
star=[]; starspeed=[]
for i in range(0, 40):
    star.append(wb.rand() % 20480)
    starspeed.append((wb.rand() % 4)+1)
x = 50; bt = btx = ct = dx = sc = 0; dir = 2; spn=[]
for i in range(0,18): spn.append(1)
while True:
    wb.blitbuf()
    for j in range(0,40):
        wb.blitbuf(star[j],255)
        star[j] = star[j]+160*starspeed[j]
        if (star[j]>20480): star[j] = star[j] - 20480
    if wb.getkey() & 4 == 4:
        x += 2
        if x > 144: x = 144
    if wb.getkey() & 8 == 8:
        x -= 2
        if x < 0: x = 0
    if wb.getkey() & 1 == 1:
        if bt==0: bt = 112; btx = x+6
    if wb.getkey() & 2 == 2:
        for i in range(0,18): spn[i]=1
    if bt > 0: wb.blitimg(1, btx, bt); bt -= 2
    ct += 1
    if (ct %4)==0:
        dx += dir
        if dx>64: dir=-2; dx=64
        if dx<1: dir=2; dx=1   
    for j in range(32,97,48): wb.blitimg(176, dx+j-16, 12, 16)          
    for i in range(0,18):
        sx = dx+(i%6)*16; sy = (i//6)*16+30
        if (spn[i]==1):
            if ((ct+i)%40<20): wb.blitimg(144, sx, sy, 16)
            else: wb.blitimg(146, sx, sy, 16)
            if (bt-sy>0) and (bt-sy<16) and (btx-sx>0) and (btx-sx<13):
                spn[i]=20; bt = 0; sc+=100
        elif (spn[i]>7): wb.blitimg(121, sx, sy, 16); spn[i]-=1
        elif (spn[i]>2): wb.blitimg(119, sx, sy, 16); spn[i]-=1
    wb.blitimg(115, x, 112, 16) 
    wb.blitstr("SCORE %5s"%(str(sc)), 20, 0)
    wb.blit()

魔改為坦克打小精靈

要學員直接寫出45行的小精靈遊戲,有點強人所難。但經過這幾天的教學課程,我們應該就有能力魔改一些地方,變成「坦克打小精靈」遊戲。我們的條件如下:

  1. 讓主角從戰鬥機變成坦克大戰的坦克
  2. 讓外星人變成小精靈的紅黃藍三種鬼
  3. 讓遊戲能動起來。

我們在不調整操作系統、遊戲背景畫面(流星天空)、爆炸效果等情況下,要如何讓遊戲可以玩呢?這也是以前大型電玩中張飛打春麗的魔改方法。是不是很有趣呢?

我們來試試底下的程式,來體驗會魔改的成就感。

https://ithelp.ithome.com.tw/upload/images/20230921/20105707OjFJ3Vl45I.png

wb.blitstr("Galaxian Demo", 0, 0)
wb.blitimg(115, 0, 20, 16, 16)                         # 戰機
wb.blitimg(119, 16, 20, 16, 16)                        # 小爆炸
wb.blitimg(121, 32, 20, 16, 16)                        # 大爆炸
wb.blitimg(144, 48, 20, 16, 16)                        # 外星人1
wb.blitimg(146, 64, 20, 16, 16)                        # 外星人2
wb.blitimg(176, 80, 20, 16, 16)                        # 小魔王

對應成

wb.blitimg(496, 0,  40, 16, 16)         # 戰車朝上 
wb.blitimg(562, 16, 40, 16, 16)         # 中爆炸
wb.blitimg(564, 32, 40, 16, 16)         # 大爆炸
wb.blitimg(336, 48, 40, 16, 16)         # 紅鬼
wb.blitimg(340, 64, 40, 16, 16)         # 黃鬼
wb.blitimg(344, 80,40, 16, 16)          # 粉紅鬼

https://ithelp.ithome.com.tw/upload/images/20230921/20105707rzZ7Ho7XqV.png

# 魔改坦克大戰小精靈

wb.blitpal()
star=[]; starspeed=[]
for i in range(0, 40):
    star.append(wb.rand() % 20480)
    starspeed.append((wb.rand() % 4)+1)
x = 50; bt = btx = ct = dx = sc = 0; dir = 2; spn=[]
for i in range(0,18): spn.append(1)
while True:
    wb.blitbuf()
    for j in range(0,40):
        wb.blitbuf(star[j],255)
        star[j] = star[j]+160*starspeed[j]
        if (star[j]>20480): star[j] = star[j] - 20480
    if wb.getkey() & 4 == 4:
        x += 2
        if x > 144: x = 144
    if wb.getkey() & 8 == 8:
        x -= 2
        if x < 0: x = 0
    if wb.getkey() & 1 == 1:
        if bt==0: bt = 112; btx = x+6
    if wb.getkey() & 2 == 2:
        for i in range(0,18): spn[i]=1
    if bt > 0: wb.blitimg(1, btx, bt); bt -= 2
    ct += 1
    if (ct %4)==0:
        dx += dir
        if dx>64: dir=-2; dx=64
        if dx<1: dir=2; dx=1   
    for j in range(32,97,48): wb.blitimg(344, dx+j-16, 12, 16)          
    for i in range(0,18):
        sx = dx+(i%6)*16; sy = (i//6)*16+30
        if (spn[i]==1):
            if ((ct+i)%40<20): wb.blitimg(336, sx, sy, 16)
            else: wb.blitimg(340, sx, sy, 16)
            if (bt-sy>0) and (bt-sy<16) and (btx-sx>0) and (btx-sx<13):
                spn[i]=20; bt = 0; sc+=100
        elif (spn[i]>7): wb.blitimg(564, sx, sy, 16); spn[i]-=1
        elif (spn[i]>2): wb.blitimg(496, sx, sy, 16); spn[i]-=1
    wb.blitimg(496, x, 112, 16) 
    wb.blitstr("SCORE %5s"%(str(sc)), 20, 0)
    wb.blit()

https://ithelp.ithome.com.tw/upload/images/20230921/20105707PpjiykW5Nc.png

遊戲類應用也要告一段落了,明天開始,我們將要介紹玩學機在網路應用方面的例子。明天見囉!


上一篇
19. 經典遊戲(四): Sprite引擎介紹與小精靈
下一篇
21. 無線網路連線
系列文
WiFiBoy Python 玩學機介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言